215. Kth Largest Element in an Array
문제
Given an integer array nums
and an integer k
, return the kth
largest element in the array.
Note that it is the kth largest element in the sorted order, not the kth distinct element.
You must solve it in O(n)
time complexity.
예제 입출력
Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
info
You can read the full description here.
힙 개념
요소 삽입
요소 추출
구현 코드
class BinaryHeap(object) :
def __init__(self) :
self.items = [None]
def __len__(self) :
return len(self.items)-1
# 삽입 시 실행, 반복 구조 구현
def _percolate_up(self) :
i = len(self)
parent = i // 2
while parent > 0 :
if self.items[i] < self.items[parent] :
self.items[parent] , self.items[i] = \
self.items[i] , self.items[parent]
i = parent
parent = i // 2
def insert(self,k) :
self.items.append(k)
self._percolate_up()
# 추출시 실행, 재귀 구조 구현
def _percolate_down(self,idx) :
left = idx * 2
right = idx * 2 + 1
smallest = idx
if left <= len(self) and self.items[left] < self.items[smallest] :
smallest = left
if right <= len(self) and self.items[right] < self.items[smallest] :
smallest = right
if smallest != idx :
self.items[idx] , self.items[smallest] = \
self.items[smallest] , self.items[idx]
self._percolate_down(smallest)
def extract(self) :
extracted = self.items[1]
self.items[1] = self.items[len(self)]
self.items.pop()
self._percolate_down(1)
return extracted
풀이 1
접근법
- 리스트를 heap으로 만들고 해당 번째까지 뽑아줍니다.
구현 코드
import heapq
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
heapq.heapify(nums)
result = 0
n = len(nums) - (k - 1)
while n > 0:
result = heapq.heappop(nums)
n -= 1
return result
복잡도 분석
- : 노드의 수
- 시간복잡도:
책에 있는 풀이
info
원본 코드는 여기에서 확인하실 수 있습니다.
풀이 2
접근법
- 새로운 힙을 만들어 heappush, heappop 합니다.
- 최대 힙을 만들기 위해 음수로 저장하고 음수로 출력합니다.
구현 코드
import heapq
from typing import List
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
heap = list()
for n in nums:
heapq.heappush(heap, -n)
for _ in range(1, k):
heapq.heappop(heap)
return -heapq.heappop(heap)
풀이 3
접근법
- heapify로 힙으로 바꿔줍니다.
- 최소 힙이기 때문에 k번이 아닌 len(nums) - k + 1 번을 뽑습니다.
구현 코드
import heapq
from typing import List
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
heapq.heapify(nums)
for _ in range(len(nums) - k):
heapq.heappop(nums)
return heapq.heappop(nums)
풀이 4
접근법
- 정렬을 이용합니다.
구현 코드
from typing import List
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
return sorted(nums, reverse=True)[k - 1]